package com.zrrd.common.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author WanJl
 * @version 1.0
 * @title RedisConfig
 * @description Redis配置类
 * @create 2024/7/2
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        //设置key的序列化方式,默认的Key序列化器为：JdkSerializationRedisSerializer
        /*
         在 Redis 中，key 和 value 都是以字节数组的形式进行存储的，而不是字符串。默认情况下，RedisTemplate 使用的是 JdkSerializationRedisSerializer 作为 key 的序列化器，它将 key 对象序列化为字节数组进行存储。但是这种方式在存储字符串类型的 key 时效率较低，因为它会将字符串对象序列化为字节数组，增加了存储和传输的开销。
         最主要的这样序列化之后key值会不一样。
         通过使用 StringRedisSerializer，可以将字符串类型的 key 直接序列化为字节数组进行存储，避免了对象序列化的开销，提高了存储和传输的效率。
         */
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //value一般就不需要序列化了，因为我们在Java中根据key获取value的时候，还会进行相应的反序列化操作。
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        //设置HashKey的序列化方式
        /*
         将 RedisTemplate 的 hash key 序列化器设置为 StringRedisSerializer。
         在 RedisTemplate 中，hash key 默认的序列化器是 JdkSerializationRedisSerializer，它会将对象序列化成字节数组存储在 Redis 中。而使用 StringRedisSerializer，可以将 hash key 序列化成字符串形式存储在 Redis 中。
         */
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        /*
            将连接工厂对象传递给RedisTemplate，从而使RedisTemplate能够使用该连接工厂来创建和管理Redis连接。
         */
        redisTemplate.setConnectionFactory(connectionFactory);
        /*
            连接工厂通常是通过配置文件或者代码创建的，它包含了连接Redis所需的配置信息，例如主机名、端口号、密码等。连接工厂还负责创建和管理连接池，以提高连接的复用性和性能。
         */
        return redisTemplate;
    }
}
